Amazon Data FirehoseでCloudTrailログをSplunkに取り込む

Amazon Data FirehoseでCloudTrailログをSplunkに取り込む

SplunkにAWSのログ連携する時のアーキテクチャのご紹介と設定方法になります。信頼性かつリアルタイム性の高いAmazon Data Firehoseを連携を実施してみました。
Clock Icon2024.10.07

10/3にSplunkパートナー向けオフラインの勉強会を開催していただきました。
その中でPUSH型取り込みのAmazon Data Firehoseを連携させたデータ取り込みをハンズオン形式で実施したので、その内容を皆様に共有させていただきたいと思います。

講師およびハンズオンの概要

※本ブログは上記ハンズオン内容に沿った内容となっております。

設定の流れ

  • SplunkコンソールでHEC(HTTP Endpoint Collector)を作成
  • CloudTrail証跡ログの設定
  • Amazon Data Firehoseの設定
  • CloudWatchサブスクリプションフィルターの設定
  • Splunkコンソールでデータ取り込み確認

データ送信アーキテクチャ

HECはHTTPプロトコルでSplunk側がログを受け取るためのエンドポイントを作成します。
送信側はアウトバウンドで、Splunk側はインバウンドで443または80の通信許可が必要です。

Screenshot 2024-10-06 at 16.39.42.jpg

このアーキテクチャを採用した場合、ほぼリアルタイムでログの取り込みが可能となり、大量のログ送信に対しても高い信頼性で取り込みを行うことができます。

その他のアーキテクチャについてはこちらでも紹介しておりますので、気になる方はぜひご覧ください。

コストは以下がおおよその目安です。

  • 想定条件: 月1TBのログデータ(毎秒約80レコード発生することを想定)
  • 1ヶ月間のレコード数: 80レコード x 60秒 x 60分 x 730時間(1ヶ月) = 210,240,000レコード / 月
  • 1レコード5KB未満の容量と想定して、計算ユニットが5KB数の倍数に切り上げられるので: 210,240,000 レコード x 5 KB = 1,051,200,000.00 KB
  • 1,051,200,000.00 KB / 1,048,576 KB in a GB = 1,002.50244140625 GB
  • 1ヶ月分の想定コスト: 1,002.50244140625 GB x 0.036 USD = 36.09 USD / 月

Amazon Data Fireshose料金
https://aws.amazon.com/jp/firehose/pricing/

ログ送信アーキテクチャ別のコストに関する参考資料
https://aws.amazon.com/blogs/apn/understand-and-optimize-aws-data-transfer-charges-for-splunk-cloud-on-aws-ingestion/

ただ注意すべき点としては、Data Firehoseを連携するには同時にCloudWatch Logsと連携が必要なことがあることです。
Data Firehoseだけだとさほど料金がかからないと思っても、CloudWatch Logsに取り込む構成に変える場合はこちらでも料金がかかってしまいます。
またCloudWatch Logsのインジェスト料金は割高なので、注意が必要です。
執筆時点ですと、アジアパシフィック(東京)で USD 0.76/GB なので、月に1TBのログが発生すると以下の料金目安になります。

  • 0.76 USD x 1,000 = 760 USD / 月

CloudWatch Logs料金
https://aws.amazon.com/jp/cloudwatch/pricing/

コスト観点ではData Firehoseと連携するのに、CloudWatch Logsを経由しなくても良いAWS WAFやVPCフローログなどのサービスがおすすめです。

やってみる

最初にSplunkのデータ入力の設定でHEC(HTTP Endpoint Collector)を作成します。

Splunkコンソールで、設定 > データ入力 に進みます。

Screenshot_2024-10-05_at_9_36_41_.jpg

HTTPイベントコレクター > 新規作成

Screenshot_2024-10-05_at_9_38_10_.jpg

コレクターの名前(任意)と インデクサー確認を有効化 にチェックします。

Screenshot_2024-10-05_at_11_20_01_.jpg

インデクサー確認を有効化 はデータ取り込み時のデータ損失を防ぐための機能です。
また、インデクサー確認を有効化 はSplunk Enterpriseでサポートしていますが、Splunk CloudではAmazon Data Firehoseのみでサポートされています。

データ取り込みの信頼性が増すため、チェックすることがおすすめですが、Splunk側でackIDとステータス情報をメモリ上に保存する点は覚えておいた方が良いです。

詳細についてはこちらの公式ドキュメントを参照してください。
https://docs.splunk.com/Documentation/Splunk/latest/Data/AboutHECIDXAck

ソースタイプは aws:cloudtrail を選択します。インデックスは任意でOKですが、このワークショップではあらかじめ aws-data というインデックスを作成しているので、これを選択します。

Screenshot_2024-10-05_at_11_23_02_.jpg

確認して、作成すると、トークン値が発行されるのでコピーしておきます。(後から設定からコレクターを選択して確認することもできます)

Screenshot_2024-10-05_at_11_26_32_.jpg

次はAWSコンソールの操作になります。
CloudTrailで証跡ログの設定をします。

Screenshot 2024-10-06 at 9.55.57.jpg

CloudTrailの名前を入力します。

Screenshot_2024-10-05_at_12_47_25_.jpg

S3バケットを新規作成します。

Screenshot_2024-10-05_at_12_47_41_.jpg

KMSキーを設定する場合は設定を行います。

Screenshot_2024-10-05_at_12_47_59_.jpg

CloudWatchログを有効にして、ロググループの作成とIAMロールの作成を行い、作成します。

Screenshot 2024-10-06 at 9.58.36.jpg

CloudWatchで作成したロググループでログが出力されていることを確認します。
ログが生成されていない場合は少し待ちます。

Screenshot_2024-10-05_at_13_23_48_.jpg

次にData FirehoseでFirehoseストリームを作成します。

Screenshot 2024-10-05 at 13.27.09.jpg

ソースは Direct PUT 、送信先は Splunk を選択します。
Firehoseストリーム名は任意の名前で入力します。

解凍をオンにする にチェック、メッセージ抽出をオンにする をチェックします。
CloudWatch Logs経由のログはGZipで圧縮されているので、この機能を使って解凍してから送信する必要があります。

Screenshot 2024-10-05 at 17.41.13.jpg

このオプションの補足情報としてこちらも参考にしていただけます。
https://dev.classmethod.jp/articles/amazon-kinesis-data-firehose-decompressed-cloudwatch-logs-destinations/

アクセスしているSplunkコンソールURLを確認して Splunkクラスターエンドポイント に入れます。
利用しているSplunkの環境によってエンドポイントのURLやポートが違うので、以下の公式ドキュメントで確認してください。(今回はSplunk Enterprise環境です)

認証トークン に前の手順で作成したHECのトークンを入れます。

Screenshot_2024-10-05_at_18_13_26_.jpg

次にCloudWatchサブスクリプションフィルターに設定するIAMロールを作成します。
IAMで新規ロール作成します。

Screenshot_2024-10-06_at_11_32_25_.jpg

カスタム信頼ポリシーを選択します。

Screenshot 2024-10-06 at 11.25.36.jpg

カスタム信頼ポリシーにステートメントを入力します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.us-west-1.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

許可ポリシーはここでは選択せずに、ロール名をつけて保存します。

Screenshot 2024-10-06 at 11.27.59.jpg

作成したロールを選択して、ポリシーを追加していきます。

Screenshot_2024-10-06_at_11_28_19_.jpg

以下のインラインポリシーを追加しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "firehose:*"
            ],
            "Resource": "arn:aws:firehose:<your-aws-region>:<your-aws-account>:deliverystream/*",
            "Effect": "Allow"
        }
    ]
}

ポリシーの名前をつけて保存します。

Screenshot 2024-10-06 at 11.29.23.jpg

同じように、以下のインラインポリシーをもう一つ追加します。
※ロール名は自分で設定したロール名を指定してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::*:role/SplunkGDIWorkshopCTrailSubscriptionRole",
            "Effect": "Allow"
        }
    ]
}

ポリシーの名前をつけて保存します。

Screenshot 2024-10-06 at 11.30.35.jpg

以下のようなロールができていればOKです。

Screenshot_2024-10-06_at_11_31_04_.jpg

次にCloudWatchでサブスクリプションフィルターの設定を行います。
CloudTrailログ証跡のロググループを選択します。

Screenshot_2024-10-06_at_9_50_25_.jpg

サブスクリプションフィルターのタブで作成を選択し、Amazon Data Firehoseサブスクリプションフィルターを作成をします。

Screenshot_2024-10-06_at_15_06_20_.jpg

Data Firehoseストリームを選択し、アクセス許可で先程つっくったIAMロールを設定します。

Screenshot 2024-10-06 at 11.49.51.jpg

Screenshot 2024-10-06 at 11.51.08.jpg

ストリーミングを開始 で設定を保存します。

これでログ連携の設定ができたので、Splunk側で入ってきているか確認します。

Screenshot_2024-10-06_at_7_24_18_.jpg

入ってきたことが確認できました!

まとめ

データ送信連携のアーキテクチャの中で最も信頼性とリアルタイム性の高い、Amazon Data Firehoseを使ったログ連携方法についてご紹介しました。
大容量のログソースでは抑えておきたいアーキテクチャになるかと思います。
またAmazon CloudWatchを経由するアーキテクチャになる場合は、コストに注意が必要な点は覚えておく必要があります。

最後にもう一度、設定箇所や関連するサービスをまとめておきます。

Splunk側

  • データの入力(HEC)設定

AWS側

  • 取得対象となるサービスのログ出力設定(今回はCloudTrail、出力先はCloudWatch Logs)
  • Data Firehoseのストリーム設定
  • IAMで各種権限設定
  • CloudWatch Logsのサブスクリプション設定(出力先がCloudWatch Logsの場合)

最後までお付き合いいただきありがとうございました。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.